package com.cskaoyan.javase.oop2._2polymorphic._2advantage._3instanceof;

/**
 * instanceof关键字
 * 语法：
 * 引用 instanceof 类名
 * 该语法表示判断：
 * 引用所指向的对象 是否是 后面类名的对象或者子类对象
 * 如果是，上述语法结构返回true
 * 如果不是，上述语法结构返回false
 *
 * 这个语法和向下转型有什么关系？
 * 如果上述结构返回true，表示可以将"引用"强转成"类名"的引用
 *
 * 在Java代码中做向下转型时，除非特别确定一定能够强转成功
 * 否则一定要用instanceof判断后 再强转
 * 避免出现ClassCastException
 *
 * 特殊的，当引用指向null时
 * 引用 instanceof 类名
 * 该语法结构直接返回false，这种设计就避免了出现空指针异常
 *
 * @since 15:09
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Father fs = new Son();
        // fs = new Father();
        // Condition 'fs instanceof Son' is always 'true'
        if (fs instanceof Son) {
            // fs指向的对象就是Son对象，所以可以强转为Son引用
            Son s = (Son) fs;
            System.out.println("666666666");
        }
        System.out.println("---------------------");
        Father fgs = new Grandson();
        if (fgs instanceof Son) {
            Son s = (Son) fgs;
            System.out.println("7777");
        }

    }
}

class Father {
}

class Son extends Father {
}

class Grandson extends Son {
}